package com.mailproject.send;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

import com.mailproject.entity.Item;
import com.util.PP;

/**
 * @author wangkai �ʼ�����
 */
public class SendMailApi {
 
	// �����˵� ���� �� ���루�滻Ϊ�Լ�����������룩
	private Item myUser;
	// �ռ������䣨�滻Ϊ�Լ�֪������Ч���䣩
	private List<Item> receiveMailAccount;

	private String title;

	private MimeMultipart mein;

	public SendMailApi(String name, String mailurl, String password, String host) {
		this.myUser = new Item(name, mailurl, password, host);
		this.receiveMailAccount = new ArrayList<Item>();
	}

	/**
	 * ��ʼ��������
	 * 
	 * @param name
	 *            ����������
	 * @param mailurl
	 *            ����������
	 * @param password
	 *            �������������루PS: ĳЩ���������Ϊ���������䱾������İ�ȫ�ԣ��� SMTP
	 *            �ͻ��������˶������루�е������Ϊ����Ȩ�롱��,���ڿ����˶������������, ����������������ʹ������������루��Ȩ�룩����
	 * @param host
	 *            ����������� SMTP ��������ַ, ����׼ȷ, ��ͬ�ʼ���������ַ��ͬ, һ��(ֻ��һ��, ���Ǿ���)��ʽΪ:
	 *            smtp.xxx.com ����163����� SMTP ��������ַΪ: smtp.163.com
	 * @return
	 */
	public static SendMailApi NOW(String name, String mailurl, String password,
			String host) {
		return new SendMailApi(name, mailurl, password, host);
	}

	/**
	 * �����ռ���
	 * 
	 * @param name
	 *            �ռ�������
	 * @param mailurl
	 *            �ռ�������
	 * @param type
	 *            �ռ����ͣ�TO���ռ��ˣ�Cc:���ͣ�Bcc:���ͣ�
	 */
	public SendMailApi addReceiveMail(String name, String mailurl,
			RecipientType type) {
		if (type == null) {
			type = RecipientType.TO;
		}
		this.receiveMailAccount.add(new Item(name, mailurl, type));
		return this;
	}

	/**
	 * ���ñ����뷢���ı�����
	 * 
	 * @param title
	 * @param text
	 * @return
	 * @throws Exception
	 */
	public SendMailApi addTitleAndText(String title, String html)
			throws Exception {
		this.title = title;
		MimeMultipart mm_text = new MimeMultipart();
		MimeBodyPart text = new MimeBodyPart();
		text.setContent(html, "text/html;charset=UTF-8");
		mm_text.addBodyPart(text);
		this.mein = mm_text;
		return this;
	}

	/**
	 * ͼ������
	 * 
	 * @param title
	 * @param text
	 * @return
	 * @throws MessagingException
	 */
	public SendMailApi addTitleAndTextImage(String title, String html,
			Map<String, String> urls) throws MessagingException {
		this.title = title;
		MimeMultipart mm_text_image = new MimeMultipart();
		if (html != null && html.trim().length() > 0) {
			MimeBodyPart text = new MimeBodyPart();
			text.setContent(html, "text/html;charset=UTF-8");
			mm_text_image.addBodyPart(text);
		}
		if (urls != null) {
			for (String str : urls.keySet()) {
				MimeBodyPart image = new MimeBodyPart();
				DataHandler dh = new DataHandler(new FileDataSource(
						urls.get(str))); // ��ȡ�����ļ�
				image.setDataHandler(dh); // ��ͼƬ������ӵ����ڵ㡱
				image.setContentID(str); // Ϊ���ڵ㡱����һ��Ψһ��ţ����ı����ڵ㡱�����ø�ID��
				mm_text_image.addBodyPart(image);
			}
			if (urls.keySet().size() > 0) {
				mm_text_image.setSubType("related"); // ������ϵ
			}
		}
		this.mein = mm_text_image;
		return this;
	}

	/**
	 * ����
	 * 
	 * @param title
	 * @param html
	 * @param urls
	 * @return
	 * @throws Exception
	 */
	public SendMailApi addTitleAndFJ(String title, String html,
			Map<String, String> urls) throws Exception {
		this.title = title;
		MimeMultipart mm_fj = new MimeMultipart();
		if (html != null && html.trim().length() > 0) {
			MimeBodyPart text = new MimeBodyPart();
			text.setContent(html, "text/html;charset=UTF-8");
			mm_fj.addBodyPart(text);
		}
		if (urls != null) {
			for (String str : urls.keySet()) {
				MimeBodyPart attachment = new MimeBodyPart();
				DataHandler dh = new DataHandler(new FileDataSource(
						urls.get(str))); // ��ȡ�����ļ�
				attachment.setDataHandler(dh); // ��ͼƬ������ӵ����ڵ㡱
				attachment.setFileName(MimeUtility.encodeText(dh.getName()));
				mm_fj.addBodyPart(attachment);
			}
			if (urls.keySet().size() > 0) {
				mm_fj.setSubType("related"); // ������ϵ
			}
		}
		this.mein = mm_fj;
		return this;
	}

	/**
	 * ͼ�ĸ���
	 * 
	 * @param title
	 * @param html
	 * @param map1ͼƬ��Դ
	 * @param map2������Դ
	 * @return
	 * @throws Exception
	 */
	public SendMailApi addTitleAndMessage(String title, String html,
			Map<String, String> map1, Map<String, String> map2)
			throws Exception {
		this.title = title;
		MimeMultipart mm_fj = new MimeMultipart();
		if (html != null && html.trim().length() > 0) {
			MimeBodyPart text = new MimeBodyPart();
			text.setContent(html, "text/html;charset=UTF-8");
			mm_fj.addBodyPart(text);
		}
		if (map1 != null) {
			for (String str : map1.keySet()) {
				MimeBodyPart image = new MimeBodyPart();
				DataHandler dh = new DataHandler(new FileDataSource(
						map1.get(str))); // ��ȡ�����ļ�
				image.setDataHandler(dh); // ��ͼƬ������ӵ����ڵ㡱
				image.setContentID(str); // Ϊ���ڵ㡱����һ��Ψһ��ţ����ı����ڵ㡱�����ø�ID��
				mm_fj.addBodyPart(image);
			}
		}
		if (map2 != null) {
			for (String str : map2.keySet()) {
				MimeBodyPart attachment = new MimeBodyPart();
				DataHandler dh = new DataHandler(new FileDataSource(
						map2.get(str))); // ��ȡ�����ļ�
				attachment.setDataHandler(dh); // ��ͼƬ������ӵ����ڵ㡱
				attachment.setFileName(MimeUtility.encodeText(dh.getName()));
				mm_fj.addBodyPart(attachment);
			}
		}
		this.mein = mm_fj;
		return this;
	}

	/**
	 * �����ʼ�(�ı��ʼ�)
	 * 
	 * @throws Exception
	 */
	public void send() throws Exception {
		Properties prop = new Properties();// ���������ʼ��������Ĳ������ã������ʼ�ʱ����Ҫ�õ���
		prop.setProperty("mail.transport.protocol", "smtp"); // ʹ�õ�Э�飨JavaMail�淶Ҫ��
		prop.setProperty("mail.smtp.host", this.myUser.getHost()); // �����˵������
																	// SMTP
		prop.setProperty("mail.smtp.auth", "true"); // ��Ҫ������֤
		Session session = Session.getInstance(prop);// ���ݲ������ã������Ự����Ϊ�˷����ʼ�׼���ģ�
		session.setDebug(true); // ����Ϊdebugģʽ, ���Բ鿴��ϸ�ķ��� log

		// 3. ����һ���ʼ�
		MimeMessage message = this.createMimeMessage(session, myUser,
				receiveMailAccount, title, this.mein);
		// 4. ���� Session ��ȡ�ʼ��������
		Transport transport = session.getTransport();
		// 5. ʹ�� �����˺� �� ���� �����ʼ�������, ������֤����������� message �еķ���������һ��, ���򱨴� //
		// PS_01: �ɰܵ��жϹؼ��ڴ�һ��, ������ӷ�����ʧ��, �����ڿ���̨�����Ӧʧ��ԭ��� log,
		// ��ϸ�鿴ʧ��ԭ��, ��Щ����������᷵�ش������鿴�������͵�����, ���ݸ����Ĵ���
		// ���͵���Ӧ�ʼ��������İ�����վ�ϲ鿴����ʧ��ԭ�� //
		// PS_02: ����ʧ�ܵ�ԭ��ͨ��Ϊ���¼���, ��ϸ������:
		// (1) ����û�п��� SMTP ����;
		// (2) �����������, ����ĳЩ���俪���˶�������;
		// (3) ���������Ҫ�����Ҫʹ�� SSL ��ȫ����;
		// (4) �������Ƶ��������ԭ��, ���ʼ��������ܾ�����;
		// (5) ������ϼ��㶼ȷ������, ���ʼ���������վ���Ұ����� //
		// PS_03: ��ϸ��log, ���濴log, ����log, ����ԭ����log��˵����
		transport.connect(this.myUser.getMailurl(), this.myUser.getPassword());
		// 6. �����ʼ�, �������е��ռ���ַ, message.getAllRecipients() ��ȡ�������ڴ����ʼ�����ʱ��ӵ������ռ���, ������, ������
		transport.sendMessage(message, message.getAllRecipients());
		// 7. �ر�����
		transport.close();

	}

	private MimeMessage createMimeMessage(Session session, Item myUser,
			List<Item> receiveMailAccount, String title, MimeMultipart mein)
			throws Exception {
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(myUser.getMailurl(), myUser
				.getName(), PP.GP("CharacterEncoding")));
		int i = 0;
		for (Item item : receiveMailAccount) {
			if (i == 0) {
				message.setRecipient(item.getType(),
						new InternetAddress(item.getMailurl(), item.getName(),
								PP.GP("CharacterEncoding")));
			} else {
				message.addRecipient(item.getType(),
						new InternetAddress(item.getMailurl(), item.getName(),
								PP.GP("CharacterEncoding")));
			}
			i++;
		}
		message.setSubject(title, PP.GP("CharacterEncoding"));
		message.setContent(mein);
		// 6. ���÷���ʱ��
		message.setSentDate(new Date());
		// 7. ��������
		message.saveChanges();
		return message;
	}

}
